package com.lsnu.ehr.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import com.lsnu.ehr.domain.Pages;
import com.lsnu.ehr.domain.Result;
import com.lsnu.ehr.entity.Dimission;
import com.lsnu.ehr.entity.Emp;
import com.lsnu.ehr.entity.Probation;
import com.lsnu.ehr.jpa.DimissionRepository;
import com.lsnu.ehr.jpa.EmpRepository;
import com.lsnu.ehr.jpa.ProbationRepository;

/**
 * 试用期控制器
 * @author 小七
 *
 */
// 允许跨域请求
@CrossOrigin
// 以json形式返回
@ResponseBody
// 控制器
@Controller

public class ProbationController {
	// 试用期分页查询 一页最多显示6条数据
	private static final Integer pageLength = 5;
	// 依赖注入，类似于配置spring的bean
	@Autowired
	ProbationRepository repositories;
	@Autowired
	EmpController empController;
	@Autowired
	DimissionRepository dimRepositoy;
	@Autowired
	DimissionController dimController;
	@Autowired
	EmpRepository empRepository;
	
	/**
	 * 添加试用期信息
	 * @param probation
	 * @return
	 */
	@RequestMapping("addProbation")
	public Object addProbation(Probation probation) {
		
		// 使用接口直接存储部门，spring会自动代理接口方法時
		// 返回值是一个持久态的Depa
		Probation dbProbation = repositories.save(probation);
		
		boolean flag = (null != dbProbation.getId());
		
		return new Result(1,flag);
	}
	/**
	 * 更新试用期信息
	 * @param probation
	 * @return
	 */
	@RequestMapping("updateProbation")
	public Object updateProTurn(Probation probation) {
		
		// 使用接口直接存储部门，spring会自动代理接口方法時
		Boolean flag = false;
		if(repositories.findById(probation.getId()) != null) {
			repositories.save(probation);
			flag = true;
		}
		
		return new Result(1,flag);
	}
	
	/**
	 * 根据试用期的id更新试用期信息
	 * @param id
	 * @param status
	 * @return
	 */
	@RequestMapping("updateProbationById")
	public Object updateProByid(@RequestParam("proId") Long id, @RequestParam("status") String status) {
		
		System.out.println("id:"+id + "  status:" + status);
		// 使用接口直接存储部门，spring会自动代理接口方法時
		// 是否 更新成功！
		Boolean flag = false;
		// 获取当前操作时间
		String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
		// 查询试用期数据
		Optional<Probation> opt = repositories.findById(id);
		// 判断是否为空
		if(null != opt) {
			flag = true;
			Probation probation = opt.get();
			// 设置处理时间
			probation.setDisposeDate(date);
			// 获取用户信息
			Emp emp = probation.getProEmp();
			
			switch (status) {
				case "不通过":
					// 如果status为未通过 则更改用户信息 进行离职操作
					// 新建一条离职信息
					Dimission dimission = new Dimission();
					// 设置离职员工信息
					dimission.setDimEmp(emp);
					// 设置离职时间，为当前处理时间
					dimission.setMisDate(date);
					// 设置离职类型  试用期不通过 类型为 不予录用
					dimission.setMisType("试用期未通过");
					// 设置离职去向
					dimission.setMisTo(" ");
					
					// 员工离职处理
					dimController.addDimission(dimission);
					
					// 设置考核结果
					probation.setAssessResult("未通过");
					// 设置状态
					probation.setStatus("不录用");
					break;
				case "延期":
					probation.setStatus("延期");
					break;
				case "转正":
					probation.setStatus("转正");
					// 设置试用期结束时间
					probation.setEndDate(date);
					// 转正则不再试用期
					emp.setIsPro(false);
					empRepository.save(emp);
					break;

			default:
				break;
			}
			// 保存
			repositories.save(probation);
			
		}
		return new Result(1,flag);
	}
	
	/**
	 * 查询试用期信息
	 * @param page
	 * @return
	 */
	@SuppressWarnings("deprecation")
	@RequestMapping("findProbation")
	public Object findProbation(@RequestParam("page") Integer page) {
		
		// 使用接口直接存储部门，spring会自动代理接口方法時
		Result result = new Result();
		result.setCode(1);
		
		if(page < 1)
			return result;
		
		Order order = new Order(Direction.ASC,"id"); //根据字段id进行排序
		// 分页排序查询  
		PageRequest pageRequest = new PageRequest(page-1, pageLength, new Sort(order));
		// 利用JpaSpecificationExecutor接口来进行简单的分页查询
		Page<Probation> depaProbation = repositories.findAll(pageRequest);
		
		return new Result(1, depaProbation);
	}
	/**
	 * 根据关键字key查询试用期信息	
	 * @param key		关键字 为id和name
	 * @param status	状态
	 * @param page	
	 * @return
	 */
	@SuppressWarnings("deprecation")
	@RequestMapping("findProbationByKey")
	public Object findProbationByKey(@RequestParam("key") String key, @RequestParam("status") String status,
			@RequestParam("page") Integer page) {
		// 判断key是否为数字
		// 页数
		//	Integer pages = page;
		Page<Probation> pa;
		// 判断当前页数是否大于0
		Integer count;
		Result result = new Result();
		// 分页信息
		Pages pages ;
		
		result.setCode(1);
		
		if(page < 1)
			return result;
		
		Order order = new Order(Direction.ASC,"id"); //根据字段id进行排序
		// 分页排序查询  
		PageRequest pageRequest = new PageRequest(page-1, pageLength, new Sort(order));
		
		List<Probation> pros = null;
		Boolean flag = true;
		// 如果key为null 则查询所有数据
		if("" == key) {
			pa = repositories.findByStatus(pageRequest,status);
			pros = pa.getContent();
			pages = new Pages(page, (int)pa.getTotalElements(), pageLength);
			return new Result(1, pros, pages, "成功~");
		}
		
		// 判断是否为数字
		for( int i = 0; i < key.length(); i++) {
			if (!Character.isDigit(key.charAt(i))){
				flag = false;
				break;
			 }
		}
		
		if(flag) {
			count = 1;
			pros = repositories.findProByIdAndStatus(new Long(key), status);
		}
		else {
			// 每个页面显示6条数据
			pros = repositories.findProByNameAndStatus(key, status, (page-1)*pageLength, pageLength);
			count = repositories.findProCountByNameAndStatus(key, status).intValue();
		}
		// 设置分页数据
		result.setPage(new Pages(page, count, pageLength));
		// 设置查询到的数据
		result.setData(pros);
		
		return result;
	}
	
	/**
	 * 根据时间区域进行分页查询
	 * @param beginDate  // 开始时间
	 * @param endDate	// 结束时间
	 * @param page
	 * @return
	 */
	@RequestMapping("findByDate")
	public Object findByDate(@RequestParam("beginDate") String beginDate,
			@RequestParam("endDate") String endDate,
			@RequestParam("page") Integer page) {
		
		System.out.println("beginDate:"+beginDate);
		System.out.println("endDate:"+endDate);
		System.out.println("page:"+page);
		Result result = new Result();
		
		result.setCode(1);
		// 分页查询
		List<Probation> pros = repositories.findByDate(beginDate, endDate, page, pageLength);
		// 存储数据
		result.setData(pros);
		// 存储当前页面
		result.setPage(new Pages(page, repositories.findByDateCount(beginDate, endDate).intValue(), pageLength));
	
		return result;
		
	}
	
}